package com.dmx.fw.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.TimeZone;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 时间工具类，与时间相关的公用方法
 * 
 * @author 沙北平
 * @date 2009年6月5日15:31:15
 */
public class DateTools {
	
	private static Log log=LogFactory.getLog(DateTools.class);

	private static final String TIME_ERROR_MESSAGE = "时间参数错误";
	
	/**
	 * 时间毫秒与秒之间的转换进制
	 */
	private static final int CONVS = 1000;

	/**
	 * 获得当前时间的秒值
	 * 
	 * @return 当前时间的秒值
	 */
	public static int currentTimeSeconds() {
		return currentTimeSeconds(System.currentTimeMillis());
	}

	/**
	 * 获得当前毫秒的秒值
	 * 
	 * @param millis
	 *            需要进行转换毫秒值
	 * @return 当前millis为正数时返回时间有毫秒转化秒的相应数值
	 */
	public static int currentTimeSeconds(Long millis) {
		int seconds = 0;
		if (millis > 0) {
			millis = millis / CONVS;
			seconds = millis.intValue();
		}
		return seconds;
	}

	/**
	 * 将seconds代表的秒值转换为毫秒值
	 * 
	 * @param seconds
	 *            需要进行转换秒值
	 * @return
	 */
	public static long convsSeconds2Millis(Integer seconds) {
		long millis = 0;
		if (seconds > 0) {
			Long chInt = seconds.longValue();
			millis = chInt * CONVS;
		}
		return millis;
	}

	/**
	 * 将date代表的时间转换为dateFormat约定格式的字符串
	 * 
	 * @param date
	 *            时间
	 * @param dateFormat
	 *            转换格式，例如yyyy/MM/dd HH:mm:ss
	 * @return
	 */
	public static String time2String(Date date, String dateFormat) {
		String STRING_ERROR_MESSAGE = "转换格式参数错误";
		String ERROR_MESSAGE = "未知错误";
		String RESULT = ERROR_MESSAGE;
		if (date != null) {
			if (StrTools.isNotBlank(dateFormat)) {
				SimpleDateFormat simple = new SimpleDateFormat(dateFormat);
				RESULT = simple.format(date);
			} else
				ERROR_MESSAGE = STRING_ERROR_MESSAGE;
		} else
			ERROR_MESSAGE = TIME_ERROR_MESSAGE;
		return RESULT;
	}

	/**
	 * 将date代表的时间转换为dateFormat约定格式的字符串
	 * 
	 * @param date
	 *            时间
	 * @param dateFormat
	 *            转换格式，例如yyyy/MM/dd HH:mm:ss
	 * @return
	 */
	public static String time2String(Calendar cal, String dateFormat) {
		if (cal != null)
			return time2String(cal.getTime(), dateFormat);
		else
			return TIME_ERROR_MESSAGE;

	}

	/**
	 * 将seconds代表的秒值时间值
	 * 
	 * @param seconds
	 *            需要进行转换秒值
	 * @return 仅在millis对于零时返回有效地时间转换值，否则返回当前时间。
	 */
	public static Calendar convsSeconds2Cal(Long millis) {
		Calendar cal = Calendar.getInstance();
		if (millis > 0)
			cal.setTimeInMillis(millis);
		return cal;
	}

	/**
	 * 将seconds代表的秒值时间值
	 * 
	 * @param seconds
	 *            需要进行转换秒值
	 * @return 仅在seconds对于零时返回有效地时间转换值，否则返回当前时间。
	 */
	public static Calendar convsSeconds2Cal(Integer seconds) {
		long millis = convsSeconds2Millis(seconds);
		return convsSeconds2Cal(millis);
	}

	/**
	 * 将seconds代表的秒值时间值
	 * 
	 * @param seconds
	 *            需要进行转换秒值
	 * @return 仅在millis对于零时返回有效地时间转换值，否则返回null。
	 */
	public static Date convsSeconds2Date(Long millis) {
		Date date = null;
		if (millis > 0)
			date = new Date(millis);
		return date;
	}

	/**
	 * 将seconds代表的秒值时间值
	 * 
	 * @param seconds
	 *            需要进行转换秒值
	 * @return 仅在seconds对于零时返回有效地时间转换值，否则返回null。
	 */
	public static Date convsSeconds2Date(Integer seconds) {
		long millis = convsSeconds2Millis(seconds);
		return convsSeconds2Date(millis);
	}
	
	
	public static Date string2Date(String date, String pattern) {
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		try {
			return df.parse(date);
		} catch (ParseException ex) {
			log.error("Fail to parse Date.", ex);
			return null;
		}
	}

	public static Date string2Date(String date, String pattern, TimeZone timeZone) {
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		df.setTimeZone(timeZone);
		try {
			return df.parse(date);
		} catch (ParseException ex) {
			log.error("Fail to parse Date.",ex);
			return null;
		}
	}
	
	public static Date formatLicenseWindowDate(String licenseWindowDate){
		List<String> formats=new ArrayList<String>();
		
		formats.clear();
		formats.add("yyyy-MM-dd");
		formats.add("yyyy-MM-dd HH:mm:ss");
		formats.add("yyyy-MM-dd'T'HH:mm:ss");
		formats.add("yyyy-MM-dd'T'HH:mm");
		formats.add("yyyy-MM-dd HH:mm");
		SimpleDateFormat dateFormat=new SimpleDateFormat();	
		Date sDate=null;
		for(Iterator i=formats.iterator();i.hasNext();){
			try{
				dateFormat.applyPattern((String)i.next());
				dateFormat.setLenient(false);
				sDate=dateFormat.parse(licenseWindowDate);
				if(dateFormat.format(sDate).equals(licenseWindowDate))
				{
					return sDate;
				}
			}catch(ParseException e){
			}
		}
		return null;
	}
	
	public static String date2String(Date date, String pattern) {
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		return df.format(date);
	}

	public static void main(String[] args) {
		System.out.println(DateTools.string2Date("2012-12-31T00:00:00", "yyyy-MM-dd %tH:%tM:%tS"));
	}

}
